﻿using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;

namespace Timo.Api.Core.Filter;

/// <summary>
/// 自定义授权筛选器
/// 通过授权筛选器可以实现在所有请求到达控制器/Action 之前进行验证，如果授权失败，直接跳转到登录或者返回 401。
/// </summary>
public class AuthorizationFilter : IAsyncAuthorizationFilter
{
    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        //Console.WriteLine("自定义授权筛选器 授权检查......");

        // 获取控制器信息
        var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;

        // 获取控制器类型
        var controllerType = actionDescriptor!.ControllerTypeInfo;

        // 获取 Action 类型
        var methodType = actionDescriptor.MethodInfo;

        // 是否匿名访问
        var allowAnonymouse = context.Filters.Any(u => u is IAllowAnonymousFilter)
                        || controllerType.IsDefined(typeof(AllowAnonymousAttribute), true)
                        || methodType.IsDefined(typeof(AllowAnonymousAttribute), true);

        // 不是匿名才处理权限检查
        //if (!allowAnonymouse)
        //{
        //    Console.Write("逻辑检查~~~~");

        //    在 MVC 项目中，如果检查失败，则跳转到登录页
        //    if (typeof(Controller).IsAssignableFrom(controllerType.AsType()))
        //    {
        //        context.Result = new RedirectResult("~/Login");
        //    }
        //    WebAPI 或者其他类型
        //    else
        //    {
        //        返回未授权
        //        context.Result = new UnauthorizedResult();
        //    }
        //}
        // 否则直接跳过处理
        //else await Task.CompletedTask;
        await Task.CompletedTask;
    }
}
